package com.gamefx.engine1
{
	import com.gamefx.engine1.vo.VAction;
	import com.gamefx.engine1.vo.VEquip;

	public class GameEngine
	{
		/**
		 * 动作哈希表，键为动作的name，值为VAction
		 */
		public static var actionMap:Object = {};

		/**
		 * 部位哈希表，键为预定义EquipID，值为Array（Array中每个元素均为一个VEquip）
		 */
		public static var equipMap:Object = {};

		/**
		 * 部位子图层哈希表，键值为图层的id，每个元素均为一个VEquip
		 */
		public static var equipPartMap:Object = {};

		/**
		 * 根据装备部位的 ItemID、equipPartID、ActionID返回资源路径的函数
		 * 注:多个动作可以做到一个SWF里，也可以分散成多个SWF
		 */
		public static var getResourceUrl:Function;


		public static const DEFAULT_AVATAR_CONFIG:XML =
			<avatar>
				<actions defaultFrames="0" defaultMSPF="50" defaultLoop="1"><!--动作定义-->
					<action id="static" desc="静止" frames="1" mspf="50" loop="0"/>
					<action id="motion" desc="运动" frames="8" mspf="50" loop="1"/>
				</actions>
				<equips><!--AVATAR定义-->
					<equip id="body" desc="躯体">
						<part id="body_1" depth="1"/>
					</equip>
				</equips>
			</avatar>
			;



		/**
		 * 初始化引擎，给定必要的参数
		 *
		 * @param configData AVATAR配置
		 * <p>如果不给定值的话，将会默认使用GameEngine.DEFAULT_AVATAR_CONFIG</p>
		 *
		 * @param resourceUrlBuilder 返回资源路径的函数
		 * <p>根据装备部位的 ItemID、equipPartID、ActionID返回资源路径的函数</p>
		 */
		public static function initAvatar(avatarConfig:XML = null, resourceUrlBuilder:Function = null):void
		{
			if (avatarConfig == null)
			{
				avatarConfig = GameEngine.DEFAULT_AVATAR_CONFIG;
			}

			if (resourceUrlBuilder == null)
			{
				getResourceUrl = defaultGetResourceUrl;
			}
			else
			{
				getResourceUrl = resourceUrlBuilder;
			}

			var item:XML, childItem:XML, arrTemp:Array;
			var defaultFrames:int = int(avatarConfig.actions.@defaultFrames);
			var defaultMSPF:uint = int(avatarConfig.actions.@defaultMSPF);
			var defaultLoop:Boolean = (avatarConfig.actions.@defaultLoop == "1");
			var frames:int, mspf:uint, loop:Boolean;

			for each (item in avatarConfig.actions.elements())
			{
				frames = item.hasOwnProperty("@frames") ? int(item.@frames) : defaultFrames;
				mspf = item.hasOwnProperty("@mspf") ? int(item.@mspf) : defaultMSPF;
				loop = item.hasOwnProperty("@loop") ? (item.@loop == "1") : defaultLoop;
				actionMap[String(item.@id)] = new VAction(String(item.@id), frames, mspf, loop);
			}

			for each (item in avatarConfig.equips.elements())
			{
				equipMap[String(item.@id)] = arrTemp = [];

				for each (childItem in item.elements())
				{
					arrTemp.push(new VEquip(String(childItem.@id), int(childItem.@depth)));
				}
			}
		}

		public static function defaultGetResourceUrl(itemID:String, equipPartID:String, actionID:String = ""):String
		{
			return itemID + "/" + equipPartID + ".swf"
		}
	}
}
